package exception.basic;

public class ThrowTest {
	
	public void worker() throws Exception{
		System.out.println(1);
		
		if (true) {//정상적으로 실행 될 수 없는 조건이 이 안으로 들어온다. 만약에 어떤 조건이 만족되면 나는 에러를 던질것이다라는 선언
			//예외 발생
			Exception e = new Exception();//Exception이라는 객체의 클래스를 생성한 것일 뿐 예외가 난 것이 아니다.
			throw e;//이렇게 까지 하면 진짜 예외가 발생한거다. throw 예외객체(throwable 타입)
			//throw e는 예외객체를 가지고 자신을 호출한 곳으로 돌아간다. 여기에 오류가 있따~~~~~ 받아라~~~
			
			
		}//트루 안에 넣으면 SOPln(2)는 에러메시지가 사라진다. 
		//Exception e = new Exception();//Exception이라는 객체의 클래스를 생성한 것일 뿐 예외가 난 것이 아니다.
		//throw e;//이렇게 까지 하면 진짜 예외가 발생한거다. throw 예외객체(throwable 타입)
		//throw e는 예외객체를 가지고 자신을 호출한 곳으로 돌아간다. 여기에 오류가 있따~~~~~ 받아라~~~
		
		System.out.println(2);//예가 에러가 나는 이유는 실행될 확률이 0%이기 때문이다.
		//그래서 throw 다음에는 실행되야하는 코드가 밑으로 오면 안된다. 
	}
		public void divide(int op) {
		if(op == 0){
			throw new ArithmeticException("0으로는 어떤 수도 못나눈다.");//실행시켜보면 전과 다른 점이 있다.
			//아리스메틱익셉션은 언체크드 익셉션, 즉 컴파일러가 오류를 검출하지 않는 오류다. 이런 종류가 있다. 그걸 알아야 한다. 
			//여기서 트라이 캐취 구문을 안썼으니까 자기를 호출한 곳으로 날아간다.
		}
			System.out.println(10/op);
		}


	public static void main(String[] args) {
		
		new ThrowTest().divide(0);//여기서도 트라이 캐취 구문으로 에러를 잡지 않았으니까 이 에러는 다시 위로 올라간다. 결국 JVM으로 올라가서 에러메시지를 나타낸다.
		System.out.println("------------------------------------");
		
		try {
			new ThrowTest().worker();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			System.out.println("예외 처리함 - 메인");
			e.printStackTrace();//이클립스가 자동으로 붙여준 에러메시지를 출력해주는 메소드
		}
		
	}
}
